// src/utils/request.js
import axios from 'axios'
import { ElMessage } from 'element-plus'

// 创建Axios实例
const request = axios.create({
  baseURL: '', // 不需要前缀，通过Vite代理转发
  timeout: 10000, // 增加超时时间到10秒
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
})

// 1. 请求拦截器：携带Token（格式：Bearer + Token）
request.interceptors.request.use(
  (config) => {
    // 判断是否是管理员接口（兼容相对/绝对URL）
    let requestPath = ''
    try {
      if (config.url) {
        // 绝对URL（含协议/域名）或以'/'开头的相对路径
        if (/^https?:\/\//i.test(config.url)) {
          const urlObj = new URL(config.url)
          requestPath = urlObj.pathname || ''
        } else {
          requestPath = config.url
        }
      }
    } catch (e) {
      // 解析失败则回退为原值
      requestPath = config.url || ''
    }

    const isAdminApi = requestPath.startsWith('/admin')
    
    // 根据接口类型选择对应的token
    const token = isAdminApi 
      ? localStorage.getItem('adminToken')
      : localStorage.getItem('token')
    
    // 更严格的token检测：检查token是否存在且不为空字符串
    if (token && token.trim() !== '') {
      // 处理后端拦截器的Bearer前缀（与LoginInterceptor对应）
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    console.error('请求发送失败:', error)
    return Promise.reject(error)
  }
)

// 2. 响应拦截器：统一处理401（Token失效）和业务错误
request.interceptors.response.use(
  (response) => {
    // 后端返回格式：{code:0成功, msg:提示, data:数据}
    const res = response.data
    if (res.code !== 0 && res.msg) {
      ElMessage.error(res.msg)
      return Promise.reject(new Error(res.msg))
    }
    return res
  },
  (error) => {
    // 处理网络错误
    if (!error.response) {
      if (error.message && error.message.includes('timeout')) {
        ElMessage.error('请求超时，请检查网络连接')
      } else if (error.message && error.message.includes('Network Error')) {
        ElMessage.error('网络连接失败，请检查网络设置')
      } else {
        ElMessage.error('网络错误，请稍后重试')
      }
      return Promise.reject(error)
    }
    
    const status = error.response.status
    const currentPath = window.location.pathname
    const isAdminPath = currentPath.startsWith('/admin')
    
    if (status === 401) {
      // Token失效：根据当前路径清除对应的Token
      if (isAdminPath) {
        // 管理员Token失效
        localStorage.removeItem('adminToken')
        ElMessage.error('登录已过期，请重新登录')
        setTimeout(() => {
          window.location.href = '/admin/login'
        }, 1000)
      } else {
        // 用户Token失效
        localStorage.removeItem('token')
        localStorage.removeItem('userInfo')
        
        // 检查是否在需要登录的页面
        const protectedPaths = ['/gear/selling', '/gear/sales', '/user/center', '/community']
        const isProtectedPage = protectedPaths.some(path => currentPath.includes(path))
        
        if (isProtectedPage) {
          // 在受保护页面，静默跳转到登录页面
          // 不显示任何提示，直接跳转
          setTimeout(() => {
            window.location.href = '/userLogin'
          }, 100)
        }
      }
      // 在其他页面，完全静默处理，不显示任何消息
    } else if (status === 404) {
      ElMessage.error('请求的接口不存在')
    } else if (status === 500) {
      ElMessage.error('服务器内部错误，请稍后再试')
    } else {
      ElMessage.error(error.message || '请求失败')
    }
    return Promise.reject(error)
  }
)

export default request